<?php
// Author : evilair
// Time   : 2017/07/25

/**************************************************
*
* 给一个由整形组成的数组,在其中找出两个数使其和等于一个给定的数.
* 
* 该函数返回和等于给定数的数组中两个整数的索引,其中索引1要小于索引2.
* 注意,返回的答案(index)不要以0起始.
* 
* Input: numbers = [2, 7, 9, 15], target = 9
* output: index1 = 1, index2 = 2
**************************************************/

$numbers = [2, 11, 7, 15];
$target = 9;
function solution($numbers, $target) {
  /*
   * 使用散列减少循环次数
   * 数组的键为数值,数组的值为索引
   *
   * 主要思路为:
   * 1) 遍历数组
   * 2) 把 target-value 作为关联数组的键存入,把位置作为值存入
   *    每次循环检查关联数组中`value`对应的键是否存在,不存在就
   *    `target-value`作为键存入关联数组,存在就找到了.
  */
  $result = [];
  $tempMap = [];
  foreach ($numbers as $key => $value) {
    if (!array_key_exists($value, $tempMap)) {
      $tempKey = $target - $value;
      $tempMap[$tempKey] = $key;
    } else {
      $result['index1'] = $tempMap[$value] + 1;
      $result['index2'] = $key + 1;
    }
  }
  return $result;
}

$output = solution($numbers, $target);
var_dump($output);
?>